home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / modelers / chmsthtc / chmsthtc.lzh / Chemesthetics / Source / Source.LZH / eingabe.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-21  |  12.4 KB  |  468 lines

  1. /* $Revision Header *** Header built automatically - do not edit! ***********
  2.  *
  3.  *    (C) Copyright 1991 by Metalworx
  4.  *
  5.  *    Name .....: eingabe.c
  6.  *    Created ..: Sun 06-Oct-91 21:43
  7.  *    Revision .: 1
  8.  *
  9.  *    Date        Author        Comment
  10.  *    =========    ========    ====================
  11.  *    19-Oct-91    Mtwx        Fehler i. Speicherverwaltung behoben
  12.  *    06-Oct-91    Mtwx        Created this file!
  13.  *
  14.  * $Revision Header ********************************************************/
  15.  #define REVISION 1
  16.  
  17. /* ------------------------------- includes ----------------------------- */
  18.  
  19. #include <math.h>
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <exec/types.h>
  23. #include <exec/memory.h>
  24. #include <intuition/intuitionbase.h>
  25. #include <libraries/mathffp.h>
  26. #include <libraries/arpbase.h>
  27. #include <libraries/reqbase.h>
  28. #include <clib/req_protos.h>
  29. #include <req.h>             /* enthΣlt #pragmas fⁿr req.library */
  30. #include <proto/exec.h>
  31. #include <proto/intuition.h>
  32.  
  33. #include <mtwx_defs.h>
  34.  
  35. #include "messages.h"
  36. #include "chem_defs.h"
  37. #include "eingabe.h"
  38.  
  39. /* ------------------------------- global references -------------------- */
  40.  
  41. #ifndef __SASC
  42. static USHORT *AddBuffer=NULL;           /* MemoryBuffer f. Gadget-Grafik */
  43. static USHORT *EditBuffer=NULL;
  44. static USHORT *UpBuffer=NULL;
  45. static USHORT *DnBuffer=NULL;
  46. #endif
  47. static struct Window *Window2;
  48.  
  49. /* ------------------------------- external references ------------------ */
  50.  
  51. extern int atomanz, drehx, drehy, drehz, ref, geladene_Atome;
  52. extern long conwin;
  53. extern double mattheit, matthm1, abstand, vergr, zf, VERGRFAKTOR;
  54. extern ATOMTYP *a[];
  55. extern ATOMTYP *alt[];          /* enthaelt Original-Werte, nicht gedreht etc. */
  56. extern VEKTOR l, b;
  57. extern USHORT GadgetID;
  58. extern BOOL reflexion;
  59. extern char Dateiname[];
  60. extern struct Atom *GAtom[];
  61. extern struct Screen *FirstScreen;
  62. extern struct ReqLib *ReqBase;
  63.  
  64. /* ------------------------------- prototypes --------------------------- */
  65.  
  66. void      uebertragen(), anzeigen(), FlushStrGadget(), Prepare();
  67.  
  68. extern void SimpleRequest();
  69.  
  70. /* ------------------------------- routines ----------------------------- */
  71.  
  72. int      Eingabe()
  73. {
  74.   register int i, j;
  75.   int        ende = 0, anfang = 1, nummer = atomanz + 1, pos, mx, my, rwert,
  76.         atomanz_alt, a_name;
  77.   char        dummy[81];
  78.  
  79. /* Fenster ÷ffnen und Texte ausgeben */
  80.   EingabeFenster.Screen = FirstScreen;
  81.   if (!(Window2 = OpenWindow(&EingabeFenster)))
  82.     return 0;
  83.   Print(Window2, Dateiname, 7, 0, -1, 20);      /* zentriert ! */
  84.   Print(Window2, "Atom                         X      Y      Z    Radius",
  85.     9, 0, 62, 127);
  86.   Box(Window2, 1, 6, 4, 35, 608, 86);
  87.   sprintf(dummy, "%s    %s               %s               %s             ",
  88.       MAGNF, TURN, LIGHT, REFLEX);
  89.   Print(Window2, dummy, 13, 2, 4, 158);
  90.  
  91. /* Speicher holen, Werte sichern etc. */
  92.   atomanz_alt = atomanz;           /* Sichern, falls Abbr. gedrueckt wird */
  93.   a[nummer]=(ATOMTYP *)ArpAlloc(sizeof(ATOMTYP)); /* fⁿr das erste neue Atom */
  94.   alt[nummer]=(ATOMTYP *)ArpAlloc(sizeof(ATOMTYP)); /* fⁿr die erste
  95.                                Sicherheitskopie */
  96.   for (i = 1; i <= atomanz; i++)
  97.   {
  98.     *a[i] = *alt[i];    /* Original-Werte zurⁿckschreiben, (enthΣlt Molekⁿl
  99.                im 'Ursprungszustand', d.h. nicht gedreht und
  100.                sortiert!!) */
  101.   }
  102.   uebertragen();
  103.   ModifyProp(&Prop, Window2, NULL, AUTOKNOB | FREEVERT, 0, 0, 0,
  104.          SetSize(atomanz,10));
  105.   while (!ende)
  106.   {
  107.     switch (Nachricht(Window2))
  108.     {
  109.       case CLOSEWINDOW:
  110.     rwert = 0;
  111.     ende++;
  112.     break;
  113.       case GADGETUP:
  114.     switch (GadgetID)
  115.     {
  116.       case 1:               /* PropGadget */
  117.         anfang = ReadLocation(atomanz,10,PropSInfo.VertPot)+1;
  118.         if(anfang > atomanz-9 && atomanz>10)
  119.           anfang=atomanz -9;
  120.         anzeigen(anfang);
  121.         break;
  122.       case 2:               /* Pfeil nach oben */
  123.         if (anfang > 1 && atomanz > 0)
  124.         {
  125.           anfang--;
  126.           ModifyProp(&Prop, Window2, NULL, AUTOKNOB | FREEVERT,
  127.               0,SetLocation(atomanz,10,anfang-1),0,PropSInfo.VertBody);
  128.           anzeigen(anfang);
  129.         }
  130.         break;
  131.       case 3:               /* Pfeil nach unten */
  132.         if (anfang < atomanz - 9 && atomanz >0)
  133.         {
  134.           anfang++;
  135.           ModifyProp(&Prop, Window2, NULL, AUTOKNOB | FREEVERT,
  136.               0,SetLocation(atomanz,10,anfang-1),0,PropSInfo.VertBody);
  137.           anzeigen(anfang);
  138.         }
  139.         break;
  140.  
  141.       case 4:               /* Vergroesserung */
  142.         ActivateGadget(&DrehX, Window2, NULL);
  143.         break;
  144.       case 5:
  145.         ActivateGadget(&DrehY, Window2, NULL);
  146.         break;
  147.       case 6:
  148.         ActivateGadget(&DrehZ, Window2, NULL);
  149.         break;
  150.       case 7:
  151.         ActivateGadget(&LichtX, Window2, NULL);
  152.         break;
  153.       case 8:
  154.         ActivateGadget(&LichtY, Window2, NULL);
  155.         break;
  156.       case 9:
  157.         ActivateGadget(&LichtZ, Window2, NULL);
  158.         break;
  159.       case 10:
  160.         ActivateGadget(&Reflex, Window2, NULL);
  161.         break;
  162.       case 11:
  163.         break;
  164.       case 12:
  165.         strcpy(a[nummer]->name, AtomSIBuff);
  166.         ActivateGadget(&PosX, Window2, NULL);
  167.         break;
  168.       case 13:
  169.         a[nummer]->x = PosXSInfo.LongInt;
  170.         ActivateGadget(&PosY, Window2, NULL);
  171.         break;
  172.       case 14:
  173.         a[nummer]->y = PosYSInfo.LongInt;
  174.         ActivateGadget(&PosZ, Window2, NULL);
  175.         break;
  176.       case 15:
  177.         a[nummer]->z = PosZSInfo.LongInt;
  178.         ActivateGadget(&Radius, Window2, NULL);
  179.         break;
  180.       case 16:
  181.         a[nummer]->r = RadiusSInfo.LongInt;
  182.         if(a[nummer]->r==0)
  183.         {
  184.           SimpleRequest(ERROR_RADIUS);
  185.           FlushStrGadget(&RadiusSInfo);
  186.           ActivateGadget(&Radius,Window2,NULL);
  187.           break;
  188.         }
  189.         if (Neu.Flags & SELECTED)  /* nur wenn wirklich neues Atom */
  190.         {
  191.           atomanz++;
  192.           anfang=atomanz>9 ? atomanz-9 : 1;
  193.           ModifyProp(&Prop, Window2, NULL, AUTOKNOB | FREEVERT,
  194.              0, SetLocation(atomanz,10,anfang-1), 0,
  195.              SetSize(atomanz,10));
  196.           nummer++;
  197.           a[nummer]=(ATOMTYP *)ArpAlloc(sizeof(ATOMTYP));
  198.           alt[nummer]=(ATOMTYP *)ArpAlloc(sizeof(ATOMTYP));
  199.         }
  200.         anzeigen(anfang);
  201.         FlushStrGadget(&AtomSInfo);
  202.         FlushStrGadget(&PosXSInfo);
  203.         FlushStrGadget(&PosYSInfo);
  204.         FlushStrGadget(&PosZSInfo);
  205.         FlushStrGadget(&RadiusSInfo);
  206.         RefreshGList(&Atom, Window2, NULL, 5);
  207.         if (Neu.Flags & SELECTED)
  208.         {
  209.           sprintf(dummy, "%3d", nummer);
  210.           Print(Window2, dummy, 1, 0, 8, 137);
  211.           ActivateGadget(&Atom, Window2, NULL);
  212.         }
  213.         break;
  214.       case 17:               /* OK */
  215.         zf = atof(VergrSIBuff);
  216.         if (zf == 0.0)
  217.           SimpleRequest(MAGNF_FACTOR);
  218.         if (zf == 0.0)
  219.           break;
  220.         drehx = DrehXSInfo.LongInt;
  221.         drehy = DrehYSInfo.LongInt;
  222.         drehz = DrehZSInfo.LongInt;
  223.         l.x = atof(LichtXSIBuff);
  224.         l.y = atof(LichtYSIBuff);
  225.         l.z = atof(LichtZSIBuff);
  226.         ref = ReflexSInfo.LongInt;
  227.         for (i = 1; i <= atomanz; i++)
  228.           *alt[i] = *a[i];         /* Original-Werte aufbewahren fuer
  229.                       erneutes Editieren */
  230.         rwert = 1;
  231.         ende++;
  232.         break;
  233.       case 18:               /* Abbruch */
  234.         atomanz = atomanz_alt;     /* "alte" Anzahl zurueckholen */
  235.         for (i = 1; i <= atomanz; i++)
  236.           *a[i] = *alt[i];           /* Ursprungsmolekⁿl zurⁿckholen */
  237.         rwert = 0;
  238.         ende++;
  239.         break;
  240.       case 19:               /* Edit oder Anfⁿgen ? */
  241.         if (Neu.Flags & SELECTED)
  242.         {
  243.           nummer = atomanz + 1;
  244.           a[nummer]=(ATOMTYP *)ArpAlloc(sizeof(ATOMTYP));
  245.           sprintf(dummy, "%3d", nummer);
  246.           Print(Window2, dummy, 1, 0, 8, 137);
  247.           ActivateGadget(&Atom, Window2, NULL);
  248.         }
  249.         break;
  250.       case LOESCHEN:
  251.         if(!(Neu.Flags & SELECTED)) /* nur im EDIT-Modus erlaubt */
  252.         {
  253.           if(atomanz)
  254.           {
  255.         for(i=nummer;i<=atomanz;i++)
  256.           *a[i]=*alt[i+1];
  257.         atomanz--;
  258.         ModifyProp(&Prop, Window2, NULL, AUTOKNOB | FREEVERT,
  259.                0, SetLocation(atomanz,10,anfang-1), 0,
  260.                SetSize(atomanz,10));
  261.         Box(Window2, 1, 6, 4, 35, 608, 86);
  262.         anzeigen(anfang);
  263.           }
  264.         }
  265.         break;
  266.     }
  267.     break;
  268.       case MOUSEBUTTONS:
  269.     mx = Window2->MouseX;
  270.     my = Window2->MouseY;
  271.     pos = (my - 38) / 8;
  272.     if (pos >= 0 && pos < 10 && mx < 618)
  273.     {
  274.       if(Neu.Flags & SELECTED)    /* im Anfⁿge-Modus ? */
  275.         SimpleRequest(WRONG_MODE);
  276.       else
  277.       {
  278.         pos = pos + anfang;
  279.         if(pos<=atomanz)
  280.         {
  281.           strcpy(AtomSIBuff, a[pos]->name);
  282.           sprintf(PosXSIBuff, "%d", a[pos]->x);
  283.           sprintf(PosYSIBuff, "%d", a[pos]->y);
  284.           sprintf(PosZSIBuff, "%d", a[pos]->z);
  285.           sprintf(RadiusSIBuff, "%d", a[pos]->r);
  286.           RefreshGList(&Atom, Window2, NULL, 5);
  287.           nummer = pos;           /* Aktuelle Atom-Nummer aufs aus-
  288.                           gewaehlte Atom setzen */
  289.           sprintf(dummy, "%3d", nummer);
  290.           Print(Window2, dummy, 1, 0, 8, 137);
  291.           a_name = 105;           /* auf ??? setzen, falls nichts ge-
  292.                           funden wird */
  293.           for (j = 1; j <= geladene_Atome; j++)
  294.           {
  295.         if (stricmp(a[pos]->name, GAtom[j]->Kurzz) == NULL)
  296.         {
  297.           a_name = j;
  298.           break;
  299.         }
  300.           }
  301.           sprintf(dummy, "%-20s", GAtom[a_name]->Name);
  302.           Print(Window2, dummy, 1, 0, 96, 136);
  303.         }
  304.       }
  305.     }
  306.     break;
  307.     }
  308.   }
  309.   CloseWindowSafely(Window2, NULL);
  310.   return rwert;
  311. }
  312.  
  313. void      uebertragen()
  314. {
  315.   char        dummy[80];
  316.  
  317.   anzeigen(1);                         /* Start immer bei 1 */
  318.   sprintf(dummy, "%4.2lf", zf);
  319.   strncpy(VergrSIBuff, dummy, VergrSInfo.MaxChars);
  320.   VergrSInfo.NumChars = strlen(VergrSIBuff);
  321.   DrehXSInfo.LongInt = drehx;
  322.   sprintf(DrehXSIBuff, "%d", drehx);
  323.   DrehYSInfo.LongInt = drehy;
  324.   sprintf(DrehYSIBuff, "%d", drehy);
  325.   DrehZSInfo.LongInt = drehz;
  326.   sprintf(DrehZSIBuff, "%d", drehz);
  327.   sprintf(dummy, "%7.0f", l.x);
  328.   strncpy(LichtXSIBuff, dummy, LichtXSInfo.MaxChars);
  329.   LichtXSInfo.NumChars = strlen(LichtXSIBuff);
  330.   sprintf(dummy, "%7.0f", l.y);
  331.   strncpy(LichtYSIBuff, dummy, LichtYSInfo.MaxChars);
  332.   LichtYSInfo.NumChars = strlen(LichtYSIBuff);
  333.   sprintf(dummy, "%7.0f", l.z);
  334.   strncpy(LichtZSIBuff, dummy, LichtZSInfo.MaxChars);
  335.   LichtZSInfo.NumChars = strlen(LichtZSIBuff);
  336.   ReflexSInfo.LongInt = ref;
  337.   sprintf(ReflexSIBuff, "%d", ref);
  338.   RefreshGList(&Vergr, Window2, NULL, 8);
  339. }
  340.  
  341. void      anzeigen(anfang)
  342. int      anfang;
  343. {
  344.   register int i, j;
  345.   int        y = 0, nummer,ende;
  346.   char        dummy[80];
  347.  
  348.   ende=atomanz > anfang+9 ? anfang+9 : atomanz;
  349.   for (i = anfang; i <= ende; i++)
  350.   {
  351.     nummer = 105;
  352.     for (j = 1; j <= geladene_Atome; j++)
  353.     {
  354.       if (stricmp(a[i]->name, GAtom[j]->Kurzz) == 0)
  355.       {
  356.     nummer = j;
  357.     break;
  358.       }
  359.     }
  360.     sprintf(dummy, "%3d)   %3s %-20s %6d %6d %6d  %4d                ",
  361.         i, a[i]->name, GAtom[nummer]->Name, a[i]->x, a[i]->y, a[i]->z,
  362.         a[i]->r);
  363.     Print(Window2, dummy, 3, 5, 8, 44 + y * 8);
  364.     y++;
  365.   }
  366. }
  367.  
  368. void      FlushStrGadget(StrInfo)
  369. struct StringInfo *StrInfo;
  370. {
  371.   strcpy(StrInfo->Buffer, "");
  372.   StrInfo->NumChars = 0;
  373.   StrInfo->BufferPos = 0;
  374. }
  375.  
  376. void      Prepare()                    /* Werte vorbereiten zum Zeichnen */
  377. {
  378.   int        n;
  379.  
  380.   atomedrehen('x', (double) drehx);
  381.   atomedrehen('y', (double) drehy);
  382.   atomedrehen('z', (double) drehz);
  383.   vergr = VERGRFAKTOR;
  384.   vergr *= zf;
  385.   abstand = BILDSCHIRMABSTAND / zf;
  386.   b.x = 0.0;
  387.   b.y = -abstand;
  388.   b.z = 0.0;
  389.   for (n = 1; n <= atomanz; n++)       /*Vergroe▀erung der Kalotten*/
  390.     a[n]->r = round(ATOMVERGRFAKT * a[n]->r);
  391.   reflexion = TRUE;
  392.   if (ref < 1)
  393.     reflexion = FALSE;
  394.   else
  395.   {
  396.     if (ref > 100)
  397.       ref = 100;
  398.     mattheit = (double) ref / 100.0;
  399.     matthm1 = 1.0 / mattheit - 1.0;
  400.   }
  401.   atomeordnen();
  402.   atomezentrieren();
  403. }
  404.  
  405. void PrepareEGadgets()
  406. {
  407. #ifndef __SASC
  408.   if(TypeOfMem(Add_data) & MEMF_FAST)
  409.   {
  410.     AddBuffer=(USHORT *)AllocMem(sizeof(Add_data),MEMF_CHIP|MEMF_PUBLIC);
  411.     if(AddBuffer==NULL)
  412.       WrConWin(conwin,NO_GADGET_MEM);
  413.     else
  414.     {
  415.       movmem(Add_data,AddBuffer,sizeof(Add_data));
  416.       NeuImage2.ImageData=AddBuffer;
  417.     }
  418.   }
  419.   if(TypeOfMem(Edit_data) & MEMF_FAST)
  420.   {
  421.     EditBuffer=(USHORT *)AllocMem(sizeof(Edit_data),MEMF_CHIP|MEMF_PUBLIC);
  422.     if(EditBuffer==NULL)
  423.       WrConWin(conwin,NO_GADGET_MEM);
  424.     else
  425.     {
  426.       movmem(Edit_data,EditBuffer,sizeof(Edit_data));
  427.       NeuImage1.ImageData=EditBuffer;
  428.     }
  429.   }
  430.   if(TypeOfMem(Dn_data) & MEMF_FAST)
  431.   {
  432.     DnBuffer=(USHORT *)AllocMem(sizeof(Dn_data),MEMF_CHIP|MEMF_PUBLIC);
  433.     if(DnBuffer==NULL)
  434.       WrConWin(conwin,NO_GADGET_MEM);
  435.     else
  436.     {
  437.       movmem(Dn_data,DnBuffer,sizeof(Dn_data));
  438.       DnImage.ImageData=DnBuffer;
  439.     }
  440.   }
  441.   if(TypeOfMem(Up_data) & MEMF_FAST)
  442.   {
  443.     UpBuffer=(USHORT *)AllocMem(sizeof(Up_data),MEMF_CHIP|MEMF_PUBLIC);
  444.     if(UpBuffer==NULL)
  445.       WrConWin(conwin,NO_GADGET_MEM);
  446.     else
  447.     {
  448.       movmem(Up_data,UpBuffer,sizeof(Up_data));
  449.       UpImage.ImageData=UpBuffer;
  450.     }
  451.   }
  452. #endif
  453. }
  454.  
  455. void FreeEGadgets()
  456. {
  457. #ifndef __SASC
  458.   if(AddBuffer)
  459.     FreeMem(AddBuffer,sizeof(Add_data));
  460.   if(EditBuffer)
  461.     FreeMem(EditBuffer,sizeof(Edit_data));
  462.   if(DnBuffer)
  463.     FreeMem(DnBuffer,sizeof(Dn_data));
  464.   if(UpBuffer)
  465.     FreeMem(UpBuffer,sizeof(Up_data));
  466. #endif
  467. }
  468.